Processing math: 100%
Глава I
1.3. Кривые Безье

Далее мы изучим другую параметрическую многочеленную кривую, кривую Бе­зье. Так как они обе используют полиномы для их координатных функций, степенная базисная и Безье формы математически эквивалентны; т.е. любая кривая, которая мо­жет быть представлена в одной, также может быть представлена в другой форме. Тем не менее, метод Безье превосходит степенную базисную форму для геометри­че­ского моделирования. Наша презентация кривых Безье, будет неформальной; для более стро­го­го и полного ознакомления читатель должен ознакомится с другой литературой [Forr72; Bezi72, Bezi86; Gord74a; Chan81; Fari93; Yama88; Hosc93; Roge90].

Степенная базисная форма имеет следующие недостатки:

Метод Безье исправляет эти недостатки.

Кривая Безье n-ой степени определяется так

C(u)=ni=0Bi,n(u)Pi0u1 (1.7)

Базисная (смешивающая) функция, {Bi,n(u)}, это классический Многочлен Бернштейна n-ой степени (Bern12; Lore86) заданный так

Bi,n(u)=n!i!(n-1)!ui(1-u)n-1 (1.8)

Геометрические коэффициенты этой функции, {Pi}, называются контрольными точками. Обратите внимание, что в определении уравнения (1.7), требуется, чтобы u[0,1].

Примеры

Пример1.4 n=1. Из уравнения (1.8) мы имеем B0,1(u)=1-u и B1,1(u)=u; и из уравнения (1.7) получим следующую функцию C(u)=(1-u)P0+uP1. Это прямой линейный сегмент между точками P0 и P1 (смотри рисунок 1.9).

Рисунок 1.9. Кривая Безье первой степени

Пример1.5 n=2. Из уравнения (1.7) и (1.8) мы имеем C(u)=(1-u)2P0+2u(1-u)P1+u2P2. Это параболическая дуга от P0 к P2 (смотри рис 1.10). Обратим внимание
  • Полигон сформированный точками {P0,P1,P2}, называется управляющий полигон, приблизительно повторяет форму кривой;
  • P0=C(0) и P2=C(1);
  • Направление касательной к кривой в её концах – параллельны к P1-P0 и P2-P1 (это выведено позже);
  • Кривая содержится в треугольнике сформированный P0P1P2.

Рисунок 1.10. Кривая Безье второй степени

Пример1.6 n=3. Мы имеем C(u)=(1-u)3P0+3u(1-u)2P1+3u2(1-u)P2+u3P3. Примеры кубических кривых Безье показаны на рис 1.11a по рис 1.11f. Обратим внимание
  • Управляющий полигон имеет приближённую форму кривых;
  • P0=C(0) и P3=C(1);
  • Касательные в конечных точка параллельны P1-P0 и P3-P2
  • Свойство выпуклой оболочки: кривые вписаны в выпуклую оболочку, сформированную управляющими точками (рис 1.11c);
  • Свойство уменьшающегося отклонения: нет прямой линии пе­ресекающей кривую больше раз, чем пересекает управляющий полигон кривой (для кривой Безье в трёхмерном пространстве, заменить слова «прямая линия» словом «плоскость»). Это свойство кривой Безье демонстрирует, что она следует дово­льно близко от управляющего полигона и сильно от него не отклоняется рис 1.11f;
  • В начале (когда u=0) кривая поворачивается в том же направ­лении, что и P0P1P2. Когда u=1 она поворачивается в направлении P1P2P3;
  • Петля в управляющем полигоне может соответствовать, а может и не соответствовать петле в кривой. Переходом между рис 1.11e и рис 1.11f будет кривая с пиком

Рисунок 1.11a. Кривые Безье третьей степени

Рисунок 1.11b.

Рисунок 1.11c.

Рисунок 1.11d.

Рисунок 1.11e.

Рисунок 1.11f.

Пример1.7 n=6. Рис 1.12 демонстрирует закрытую кривую Безье шестой степени. Кривая гладкая в C(0)(=C(1)) потому что P1-P0 параллелен P6-P5. Под гладкостью мы понимаем, что касательные в u=0 и u=1 имеют одинаковое направление.

Рисунок 1.12. Гладкая замкнутая кривая Безье шестой степени.

В дополнение к ранее упомянутым свойствам, кривые Безье инвариантны при обычных преобразованиях, таких как поворот, перемещение и масштабирование; то есть, преобразование применяется к кривой, путём применения к управляющему полигону. Мы рассмотрим эту концепцию, более подробно в Главе III для B-сплайнов (частным случаем которых, являются кривые Безье).

В любой схеме представления кривой (или поверхности) , выбор базисных функ­ций определяет геометрические характеристики схемы. На рис 1.13а-г показаны базис­ные функции {Bi,n(u)} для n=1,2,3,9. Эти функции имеют следующие свойства:

Рисунок 1.13a. Многочлен Бернштейна для n=1

Рисунок 1.13b. n=2

Рисунок 1.13c. n=3

Рисунок 1.13d. n=9

Св.1.1 Не отрицательность: Bi,n(u)0 для всех i,n и 0u1;
Св.1.2 Разбиение единицы: ni=0Bi,n(u)=1 для всех 0u1;
Св.1.3 B0,n(0)=Bn,n(1)=1;
Св.1.4 Bi,n(u) достигает ровно одного максимума на отрезке [0,1], то есть, в u=in;
Св.1.5 Симметрия: для любого n, множество многочленов {Bi,n(u)} симметрична по отношению к u=12;
Св.1.6 Рекурсивное определение: Bi,n(u)=(1-u)Bi,n-1(u)+uBi-1,n-1(u) (смотри рис 1.14); мы определили Bi,n(u)0 если i<0 или i>n;

Рисунок 1.14. Рекурсивное определение многочлена Бернштейна, B1,3(u)

Из уравнения (1.8) мы имеем B0,0(u)=1. Используя свойство 1.6, линейные и квадратичные многочлены Бернштейна B0,1(u)=(1-u)B0,0(u)+uB-1,0(u)=1-u B1,1(u)=(1-u)B1,0(u)+uB0,0(u)=u B0,2(u)=(1-u)B0,1(u)+uB-1,1(u)=(1-u)2 B1,2(u)=(1-u)B1,1(u)+uB0,1(u)=(1-u)u+u(1-u)=2u(1-u) B2,2(u)=(1-u)B2,1(u)+uB1,1(u)=u2
Св.1.7 Производные: Bi,n(u)=dBi,n(u)du=n(Bi-1,n-1(u)-Bi,n-1(u))

с B-1,n-1(u)Bn,n-1(u)0

На рисунке 1.15a показано определение B2,5, а на рисунке 1.15b - все функции кубической производной.

Рисунок 1.15a. Производная B2,5 по B1,4 и B2,4

Рисунок 1.15b. ппроизводные четырех кубических полиномов Бернштейна B0,3; B1,3; B2,3; B3,3

Свойство 1.6 дает простые алгоритмы для вычисления значений многочленов Бернштейна при фиксированных значениях u. Алгоритм А1.2 вычисляет значение Bi,n(u) для фиксированного u. Вычисление B1,3 представлено в Таблице 1.1.

Таблица 1.1 Вычисление B1,3
0=B-2,0 B-1,2
B-1,1 B0,3
0=B-1,0 B0,2
B0,1 B1,3
1=B0,0 B1,2
B1,1 B2,3
0=B1,0 B2,2

Алгоритм А1.2

Bernstein(i,n,u,B)
{ /* Вычисление значения многочлена Бернштейна */
  /* Вход: i,n,u  */
  /* Выход: B */
for (j=0; j<=n; j++) /* вычисление колонок */
   temp[j] = 0.0; /* Таблицы 1.1 */
temp[n-i] = 0.0; /* во временный массив */
u1 = 1.0 – u;
for (k=0; k<=n; k++)
   for (j=0; j>=k; j++)
      temp[j] = u1*temp[j] + u*temp[j-1];
B = temp[n];
}
  

Алгоритм А1.3 вычисляет n-1 многочлена Бернштейна nой степени с ненуле­вым фиксированным u. Это позволяет избежать ненужных вычислений нулевых условий. Алгоритм изображен в таблице 1.2 для кубического случая.

Таблица 1.2 Вычисление всех кубических многочленов Бернштейна
B-1,1 B0,3
B-1,0 B0,2
B0,1 B1,3
1=B0,0 B0,2
B1,1 B2,3
B1,0 B2,2
B2,1 B3,3

Алгоритм А1.3

AllBernstein(n,u,B)
{ /* Вычисление всех многочленов Бернштейна n-ой степени */
/* Вход: n,u  */
/* Выход: B (массив, B[0], …, B[n]) */
B[0] = 1.0;
u1 = 1.0 – u;
for (j=1; j<=n; j++)
   {
   saved = 0.0;
   for (k=0; k<j; k++)
      {
      Temp = B[k];
      B[k] = saved + u1* temp;
      saved = u*temp;
      }
   B[j] = saved
   }
}
    

Алгоритм А1.4 комбинирует А1.3 и уравнение (1.7) вычисляет точку на кривой Безье nой степени с фиксированным значением u.

Алгоритм А1.4

PointOnBezierCurve(P,n,u,C)
{ /* Вычисление точку на кривой Безье */
  /* Вход: P,n,u  */
  /* Выход: C (точка) */
AllBernstein(n,u,B)  /* B локальный массив */
C = 0.0;
for (k=0; k<=n; k++)
   C = C + B[k]*P[k];
}
  

Используя свойство 1.7, легко вывести общее выражение производных кривой Безье

C(u)=d(ni=0Bi,n(u)Pi)du=ni=0Bi,n(u)Pi

=ni=0n(Bi-1,n-1(u)-Bi,n-1(u))Pi

=nn-1i=0Bi,n-1(u)(Pi+1-Pi) (1.9)

Из уравнения (1.9) легко получить формулы для конечных производных кривой Безье, например

C(0)=n(P1-P0)C(0)=n(n-1)(P0-2P1+P2)

C(1)=n(Pn-Pn-1)C(1)=n(n-1)(Pn-2Pn-1+Pn-2) (1.10)

Обратите внимание, из уравнений (1.9) и (1.0) следует, что

Пусть n=2 и C(u)=2i=0Bi,2(u)Pi. Тогда

C(u)=(1-u)2P0+2u(1-u)P1+u2P2

=(1-u)((1-u)P0+uP1линеный)+u((1-u)P1+uP2линеный)

Таким образом, C(u) получают в виде линейной интерполяции двух кривых Безье первой степени; В частности, любая точка на C(u) получается три линейной интерпо­ляции.

Если предположить, что u=u0 фиксированно и дать P1,0=(1-u0)P0+u0P1, P1,1=(1-u0)P1+u0P2, и P2,0=(1-u0)P1,0+u0P1,1, следует что C(u0)=P2,0. Ситуация показана на рис 1.16, и кубический случай показан на рис 1.17.

Рисунок 1.16. Получение точки на квадратичной кривой Безье путем многократной линейной интерполяции при u=25

Рисунок 1.17. Точка на кубической кривой Безье с помощью повторной линейной интерполяции в u=25

Обозначая общую кривую Безье n-ой степени как Cn(P0,...,Pn), мы имеем

Cn(P0,...,Pn)=(1-u)Cn-1(P0,...,Pn-1)+uCn-1(P0,...,Pn) (1.11)

Это следует из рекурсивного определения базисных функций (смотри свойство 1.6). Фиксированное u=u0 и обозначая Pi как P0,i, уравнение (1.11) дает рекурсив­ный алгоритм для вычисления C(u0)=Pn,0(u0) на кривой Безье n-ой степени, т.е.

Pk,i(u0)=(1-u0)Pk-1,i(u0)+u0Pk-1,i+1(u0)   где {k=(1,...,n)i=(0,...,n-k)(1.12)

Уравнение (1.12) называются Алгоритм де Кастельжо. Это процесс отрезания углов (смотри рис 1.16 и 1.17) который даёт треугольную таблицу точек показаную в Таблице 1.3.

Алгоритм А1.5

deCasteljau1(P,n,u,C)
{ /* Вычисление точку на кривой Безье */
  /* Алгоритм де Кастельжо */
  /* Вход: P,n,u  */
  /* Выход: C (точка) */
for (i=0; i<=n; i++)  /* Используя локальный массив таким образом, мы не */
   Q[i] = P[i];       /* разрушаем контрольные точки */
for (k=0; k<=n; k++)
   for (i=0; i<=n-k; i++)
      Q[i] = (1.0 - u)*Q[i] + u*Q[i + 1];
C = Q[0];
}
    
Таблица 1.3 Точки генерируемые алгоритмом де Кастельжо
P0
P1,0
P1 P2,0
P1,1
P2
Pn-1,0
Pn,0=C(u0)
Pn-1,1
Pn-2
P1,n-2
Pn-1 P2,n-2
P1,n-1
Pn

Мы закончим этот параграф сравнением Безье и степенных базисных методов. Очевидно, что формула Безье является более геометрической из двух. Уравнение (1.10), а с выпуклой оболочкой и свойствами осцилляции делает кривые Безье более подходящими для интерактивного дизайна кривой. Контрольные точки дают разработ­чику более интуитивные ручки для формы кривой, чем коэффициенты степенных бази­сов. Кроме того, алгоритм де Кастельжо менее склонен к ошибкам округления, чем алгоритм Горнера. Это интуитивно понятно, если учесть, что алгоритм де Кастельжо просто повторяют линейную интерполяцию между точками, в каждом из которых лежат в непосредственной близости от кривой. Единственный недостаток формулы Безье является то, что оценка точки является менее эффективным (см Алгоритмы A1.1, A1.4, и A1.5, и Упражнение 1.13 позже в этой главе).